 
 
 
  
  Fruit教程翻译:1. 入门,1. Getting started
让我们来看一个简单的示例:使用Fruit 来编写的一个世界妳好(Hello world)。对于这种场景,使用Fruit来实现可能有点小题大做了,但是,通过这个示例,我们能够观摩Fruit 的基本功能和语法。
   
    #include <fruit/fruit.h>
#include <iostream>
   
   
    
    
   
   
    using fruit::Component;
   
   
    
   
   
    using fruit::Injector;
   
   
    
    
   
   
    class Writer {
   
   
    
   
   
    public:
   
   
    
   
   
      virtual void write(std::string s) = 0;
   
   
    
   
   
    };
   
   
    
    
   
   
    class StdoutWriter : public Writer {
   
   
    
   
   
    public:
   
   
    
   
   
      // 类似
   
   
    于
   
   
    "StdoutWriter() = default;"
   
   
    ,但是,额外地将这个构造函数标记为
   
   
    要用于注入。
   
   
    
   
   
      INJECT(StdoutWriter()) = default;
   
   
    
   
   
    
   
   
    
   
   
      virtual void write(std::string s) override {
   
   
    
   
   
        std::cout << s;
   
   
    
   
   
      }
   
   
    
   
   
    };
   
   
    
    
   
   
    class Greeter {
   
   
    
   
   
    public:
   
   
    
   
   
      virtual void greet() = 0;
   
   
    
   
   
    };
   
   
    
    
   
   
    class GreeterImpl : public Greeter {
   
   
    
   
   
    private:
   
   
    
   
   
      Writer* writer;
   
   
    
    
   
   
    public:
   
   
    
   
   
      // 类似
   
   
    于
   
   
    "GreeterImpl(Writer* writer) : ... {...}"
   
   
    ,但是,额外地将这个构造函数标记为要用于注入。
   
   
    
   
   
      INJECT(GreeterImpl(Writer* writer))
   
   
    
   
   
        : writer(writer) {
   
   
    
   
   
      }
   
   
    
   
   
    
   
   
    
   
   
      virtual void greet() override {
   
   
    
   
   
        writer->write("Hello world!\n");
   
   
    
   
   
      }
   
   
    
   
   
    };
   
   
    
    
   
   
    Component<Greeter> getGreeterComponent() {
   
   
    
   
   
      return fruit::createComponent()
   
   
    
   
   
        .bind<Writer, StdoutWriter>()
   
   
    
   
   
        .bind<Greeter, GreeterImpl>();
   
   
    
   
   
    }
   
   
    
    
   
   
    int main() {
   
   
    
   
   
      Injector<Greeter> injector(getGreeterComponent());
   
   
    
   
   
      Greeter* greeter = injector.get<Greeter*>();
    
   
   
    
   
   
      greeter->greet();
   
   
    
   
   
    
   
   
    
   
   
      return 0;
   
   
    
   
   
    }
   
  
以上程序代码的结构,可使用下面的组件图来表示。
StdoutWriter类,不依赖任何东西,并且提供了一个StdoutWriter实例。StdoutWriter 与 Writer 之间的绑定,需要有一个StdoutWriter 实例,并且提供了一个Writer 实例。GreeterImpl类需要一个Writer实例,并且提供了一个GreeterImpl实例。GreeterImpl 与 Greeter 之间的绑定,需要一个GreeterImpl 实例,并且提供了一个Greeter 实例。最后,GreeterComponent不需要任何东西,并且提供了一个Greeter实例。
使用Fruit 的时候,一般都会将复合组件放在一个 get * Component() 函数中定义,该函数首先调用 createComponent() 来创建一个空的组件,然后使用一系列的操作函数来添加子组件。此处,我们只看到了 bind<I, C>() 操作函数,实际上还有狠多其它的操作函数。然后,这一系列操作函数调用的结果,被通过一个隐式转换操作转换成预期的组件类型(在这个示例中,就是 Component<Greeter> );在这个转换过程中,Fruit会针对绑定的那些类查找其中使用 INJECT() 包装的构造函数,这就是以上的两个组件被加入的方式。注意,组件 并不需要将所有被绑定的接口都暴露出来,例如,在这个示例中,我们并没有暴露Writer接口,同时,我们也并未暴露任何的实现类。对于 getGreeterComponent() ,也可以写成另外一种返回一个 Component<Greeter, Writer, GreeterImpl, StdoutWriter> 的形式。
通常都狠有必要隐藏掉实体(concrete)类的信息,所以,当某个类被绑定到某个接口时,实现类通常并未提供。为了简化表示,在此教程的后续部分,我们会将实现类与所有相关的绑定表示为单个组件。因此,上面的图可以简化成:
在 教程 的下一部分 中,我们会观摩一个使用Fruit 实现的简单系统。
光盘加密
一点冲上天
黄河两岸湾
八子大张口
言字往里走
你一扭,我一扭
你一长,我一长
中间夹个马大王
心字做底,月字做旁
契个钉钉儿挂衣裳
坐个车车儿走咸阳
水母
叶海龙
Your opinionsHxLauncher: Launch Android applications by voice commands
